package 热题100;

public class 热题2两数相加 {

    /**
     *
     * @param l1 输入链表1 ：如果 1，2，3 表示 321
     * @param l2 输入链表2：如 1，2，3 表示321
     * @return 返回两个链表相加的和的结果  642 -》 2，4，6
     */

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int count = 0;//进位数
        ListNode root = new ListNode();//结果节点
        ListNode head = root;//结果辅助节点
        //如果l1和l2中有不为空的节点，就继续遍历
        while (l1 != null || l2 != null){
            int v1 = l1 == null ? 0 : l1.val;
            int v2 = l2 == null ? 0 : l2.val;
            int sum = v1 +  v2 + count;//计算v1 + v2 + 进位的值的结果
            count = sum / 10;//每次结算后，重新计算进位
            head.next = new ListNode(sum % 10);
            head = head.next;
            //然后每次将l1，l2后移
            if (l1 != null){
                l1 = l1.next;
            }
            if (l2 != null){
                l2 = l2.next;
            }
        }
        //最后如果还有进位，就在新建一个新节点
        if (count > 0){
            head.next = new ListNode(count);
        }
        //最后返回虚拟节点的下一节点
        return root.next;
    }
}
